//专门处理array里面的方法pop/shift...
import {
  ARR_METHODS
} from './config';

import observeArr from './observeArr';


//根据旧的对象创建新的对象
var originArrMethods = Array.prototype,
  arrMethods = Object.create(originArrMethods);


/**
 * console.log(arrMethods);
 * {
 *   pop: ƒ (),
 *   push: ƒ (),
 *   reverse: ƒ (),
 *   shift: ƒ (),
 *   sort: ƒ (),
 *   splice: ƒ (),
 *   unshift: ƒ ()
 * }
 */


//遍历每一项数组操作方法
ARR_METHODS.map(function (m) {

  //重写新的数组处理方法
  //args 处理方法的参数(不固定) 如arr.push(123)
  arrMethods[m] = function () {

    //拿到形参的参数类数组列表
    //将类数组转为数组
    var args = Array.prototype.slice.call(arguments);

    var rt;

    //旧功能：调用原数组方法
    //this -> 调用者
    originArrMethods[m].apply(this, args);

    console.log(args);

    //给`push/unshift/splice`方法新增数组元素时更多业务逻辑
    var newArr;

    //取出添加的新参数做处理
    switch (m) {
      case 'push':
        break;
      case 'unshift':
        newArr = args;
        break;
      case 'splice':
        //splice(位置0,位置1,新增内容{}或[])
        newArr = args.slice(2);
        break;
      default:
        break;
    }

    //newArr有可能不存在，因为有时候slice()没有传第三个参数
    //给新增的数组参数重写做响应式
    newArr && observeArr(newArr);
    return rt;

  }
});

export {
  arrMethods
};